package main

import "fmt"

// 假设业务需要按步骤创建一系列复杂的对象，
// 实现这些步骤的代码加在一起非常繁复，我们可以将这些代码放进一个包含了众多参数的构造函数中，
// 但这个构造函数看起来将会非常杂乱无章，且难以维护

type Builder interface {
	Part1()
	Part2()
	Part3()
}

type Director struct {
	builder Builder
}

func NewDirector(builder Builder) *Director {
	return &Director{builder: builder}
}

func (d *Director) Construct() {
	d.builder.Part1()
	d.builder.Part2()
	d.builder.Part3()
}

type Builder1 struct{}

func (b *Builder1) Part1() {
	fmt.Println("part1")
}
func (b *Builder1) Part2() {
	fmt.Println("part2")
}
func (b *Builder1) Part3() {
	fmt.Println("part3")
}

// 使用
func ExampleBuilder() {
	builder := &Builder1{}
	director := NewDirector(builder)
	director.Construct()
}
